--[[

	-----------------------------
	nnCast (Announcer for caster)
	-----------------------------
	GUI 및 초기값 설정

--]]

if not nnCast then return end

-------------------------------------------------------------------------------------
-- 상수
-------------------------------------------------------------------------------------
	local listPosition = {
		UI_NOTIFICATION = "NOTIFICATION",
		UI_INCOMING = "INCOMING",
		UI_OUTGOING = "OUTGOING",
	}

	-------
	-- 채널
	-------
	local listChannel = {
		SAY = "일반",
		YELL = "외침",
		PARTY = "파티",
		RAID = "공격대",
		RAID_WARNING = "공격대 경보",
		USER_CHANNEL = "사용자 채널",
		CHAT_FRAME = "대화창",
		NONE = "없음",
	}

	---------
	-- 초기값
	---------
	local defaults = {
		profile = {
			onLoadClear = true,
			dispel = true,
			dispelEnemy = false,
			ccbreak = false,
			interrupt = true,
			reflect = true,
			success = true,
			missed = true,
			aura = true,
			debuff = true,
			resurrect = true,
			duration = true,
			channel = {
				dispel = "PARTY",
				ccbreak = "PARTY",
				interrupt = "PARTY",
				hostileinterrupt = "PARTY",
				reflect = "PARTY",
				success = "PARTY",
				missed = "PARTY",
				aura = "PARTY",
				debuff = "PARTY",
				resurrect = "PARTY",
			},
			whisper = {
				dispel = "",
				ccbreak = "",
				interrupt = "",
				hostileinterrupt = "",
				reflect = "",
				success = "",
				missed = "",
				aura = "",
				debuff = "",
				resurrect = "",
			},
			position = {
				dispel = "UI_INCOMING",
				ccbreak = "UI_OUTGOING",
				interrupt = "UI_NOTIFICATION",
				hostileinterrupt = "UI_NOTIFICATION",
				reflect = "UI_NOTIFICATION",
				success = "UI_OUTGOING",
				missed = "UI_NOTIFICATION",
				aura = "UI_OUTGOING",
				debuff = "UI_NOTIFICATION",
				resurrect = "UI_OUTGOING",
			},
			useAddon = true,
			useErrorFrame = false,
			alwaysAlarm = true,
			userChannel = "",
			useSrcLink = false,
			useDestLink = true,
		},
	}

	-----------
	-- GUI 설정
	-----------
	local options = {
		type = "group",
		name = "nnCast",
		-- childGroups = "tab",
		args = {
			---------
			-- Common
			---------
			common = {
				type = "group",
				name = "공통",
				desc = "공통 설정",
				order = 10,
				args = {
					useAddon = {
						type = "toggle",
						name = "외부 UI 사용",
						desc = "외부 UI를 통해 메세지를 출력합니다.",
						get = function(i) return nnCast.db.profile.useAddon end,
						set = function(i, v) nnCast.db.profile.useAddon = v end,
						order = 10,
					},
					useErrorFrame = {
						type = "toggle",
						name = "에러로 출력",
						desc = "메세지를 에러 프레임으로 출력합니다. (화면 중앙 상단)",
						get = function(i) return nnCast.db.profile.useErrorFrame end,
						set = function(i, v) nnCast.db.profile.useErrorFrame = v end,
						order = 20,
					},
					alwaysAlarm = {
						type = "toggle",
						name = "파티가 아닐 때도 메시지 출력",
						desc = "파티에 속해 있지 않을 때에도 대화창에 메시지를 출력합니다. (자신에게만 출력)",
						get = function(i) return nnCast.db.profile.alwaysAlarm end,
						set = function(i, v) nnCast.db.profile.alwaysAlarm = v end,
						order = 30,
					},
					userChannel = {
						type = "input",
						name = "사용자 채널",
						desc = "사용자 채널로 사용할 채널명",
						get = function(i) return nnCast.db.profile.userChannel end,
						set = function(i, v) nnCast.db.profile.userChannel = v end,
						usage = "<채널명>", -- 채널명 유효성(임시) : 영문, 한글, 숫자, 언더바
						pattern = "^[a-zA-Z가-힣0-9_]*$",
						order = 40,
					},
					clearWhisper = {
						type = "execute",
						name = "귓속말 대상 초기화",
						desc = "귓속말 알림 대상으로 설정된 ID들을 모두 삭제합니다.",
						func = function(v) nnCast:ClearWhisper() end,
						order = 50,
					},
					onLoadClearWhisper = {
						type = "toggle",
						name = "로드 시 자동 ID 초기화",
						desc = "nnCast 로드 시 자동으로 설정된 ID들을 모두 삭제합니다.",
						get = function(i) return nnCast.db.profile.onLoadClear end,
						set = function(i, v) nnCast.db.profile.onLoadClear = v end,
						order = 60,
					},
					head1 = {
						type = "header",
						name = "",
						order = 70,
					},
					desc1 = {
						type = "description",
						name = "스킬 링크 사용",
						order = 71,
					},
					useSrcLink = {
						type = "toggle",
						name = "원본 스킬 링크 사용",
						desc = "원본 스킬을 스킬 링크로 표시합니다.",
						get = function(i) return nnCast.db.profile.useSrcLink end,
						set = function(i, v) nnCast.db.profile.useSrcLink = v end,
						order = 72,
					},
					useDestLink = {
						type = "toggle",
						name = "대상 스킬 링크 사용",
						desc = "대상 스킬을 스킬 링크로 표시합니다.",
						get = function(i) return nnCast.db.profile.useDestLink end,
						set = function(i, v) nnCast.db.profile.useDestLink = v end,
						order = 73,
					},
				},
			},
			---------
			-- Dispel
			---------
			dispel = {
				type = "group",
				name = "해제",
				desc = "주문 해제 관련 설정",
				order = 20,
				args = {
					dispel = {
						type = "toggle",
						name = "주문 해제 알림",
						desc = "주문 해제 알림 기능을 사용합니다.",
						get = function(i) return nnCast.db.profile.dispel end,
						set = function(i, v)
							nnCast.db.profile.dispel = v
							nnCast:LoadEvents()
						end,
						order = 10,
					},
					enemy = {
						type = "toggle",
						name = "공격적인 해제만 알림",
						desc = "우호적 대상에 대한 해제는 알리지 않습니다.",
						get = function(i) return nnCast.db.profile.dispelEnemy end,
						set = function(i, v) nnCast.db.profile.dispelEnemy = v end,
						disabled = function() return not nnCast.db.profile.dispel end,
						order = 20,
					},
					ccbreak = {
						type = "toggle",
						name = "군중 제어 해제 알림",
						desc = "자신의 공격에 의해 군중 제어 스킬이 해제 되었을때 알립니다.",
						get = function(i) return nnCast.db.profile.ccbreak end,
						set = function(i, v)
							nnCast.db.profile.ccbreak = v
							nnCast:LoadEvents()
						end,
						order = 30,
					},
					head1 = {
						type = "header",
						name = "",
						order = 80,
					},
					desc1 = {
						type = "description",
						name = "대화창 알림 설정",
						order = 81,
					},
					channel = {
						type = "select",
						name = "주문 해제 알림 채널",
						desc = "주문 해제 알림 메세지를 출력할 채널 선택.",
						get = function(i) return nnCast.db.profile.channel.dispel end,
						set = function(i, v)
							nnCast.db.profile.channel.dispel = v
							nnCast.db.profile.channel.ccbreak = v
						end,
						values = listChannel,
						order = 82,
					},
					whisper = {
						type = "input",
						name = "주문 해제 귓속말 알림 대상",
						desc = "주문 해제 귓속말 알림 대상의 ID를 입력하세요.",
						get = function(i) return nnCast.db.profile.whisper.dispel end,
						set = function(i, v)
							nnCast.db.profile.whisper.dispel = v
							nnCast.db.profile.whisper.ccbreak = v
						end,
						usage = "<사용자명>",
						pattern = "^[a-zA-Z가-힣]*$",
						order = 83,
					},
					head2 = {
						type = "header",
						name = "",
						order = 90,
					},
					desc2 = {
						type = "description",
						name = "외부 UI 표시 설정",
						order = 91,
					},
					position_dispel = {
						type = "select",
						name = "주문 해제 표시 위치",
						desc = "주문 해제 메세지를 표시할 위치 선택.",
						get = function(i) return nnCast.db.profile.position.dispel end,
						set = function(i, v) nnCast.db.profile.position.dispel = v end,
						values = listPosition,
						order = 92,
					},
					position_ccbreak = {
						type = "select",
						name = "군중 제어 해제 표시 위치",
						desc = "군중 제어 해제 메세지를 표시할 위치 선택.",
						get = function(i) return nnCast.db.profile.position.ccbreak end,
						set = function(i, v) nnCast.db.profile.position.ccbreak = v end,
						values = listPosition,
						order = 93,
					},
				},
			},
			------------
			-- Interrupt
			------------
			interrupt = {
				type = "group",
				name = "차단",
				desc = "주문 차단 관련 설정",
				order = 30,
				args = {
					interrupt = {
						type = "toggle",
						name = "주문 차단 알림",
						desc = "주문을 차단하거나, 당했을때 알리는 기능을 사용합니다.",
						get = function(i) return nnCast.db.profile.interrupt end,
						set = function(i, v)
							nnCast.db.profile.interrupt = v
							nnCast:LoadEvents()
						end,
						order = 10,
					},
					reflect = {
						type = "toggle",
						name = "주문 반사 알림",
						desc = "자신을 대상으로한 상대방의 주문을 반사 했을때 알리는 기능을 사용합니다.",
						get = function(i) return nnCast.db.profile.reflect end,
						set = function(i, v)
							nnCast.db.profile.reflect = v
							nnCast:LoadEvents()
						end,
						order = 20,
					},
					head1 = {
						type = "header",
						name = "",
						order = 80,
					},
					desc1 = {
						type = "description",
						name = "대화창 알림 설정",
						order = 81,
					},
					channel = {
						type = "select",
						name = "주문 차단/반사 알림 채널",
						desc = "주문 차단/반사 알림 메세지를 출력할 채널 선택.",
						get = function(i) return nnCast.db.profile.channel.interrupt end,
						set = function(i, v)
							nnCast.db.profile.channel.interrupt = v
							nnCast.db.profile.channel.hostileinterrupt = v
							nnCast.db.profile.channel.reflect = v
						end,
						values = listChannel,
						order = 82,
					},
					whisper = {
						type = "input",
						name = "주문 차단/반사 귓속말 알림 대상",
						desc = "주문 차단/반사 귓속말 알림 대상의 ID를 입력하세요.",
						get = function(i) return nnCast.db.profile.whisper.interrupt end,
						set = function(i, v)
							nnCast.db.profile.whisper.interrupt = v
							nnCast.db.profile.whisper.hostileinterrupt = v
							nnCast.db.profile.whisper.reflect = v
						end,
						usage = "<사용자명>",
						pattern = "^[a-zA-Z가-힣]*$",
						order = 83,
					},
					head2 = {
						type = "header",
						name = "",
						order = 90,
					},
					desc2 = {
						type = "description",
						name = "외부 UI 표시 설정",
						order = 91,
					},
					position = {
						type = "select",
						name = "주문 차단/반사 표시 위치",
						desc = "주문 차단/반사 메세지를 표시할 위치 선택.",
						get = function(i) return nnCast.db.profile.position.interrupt end,
						set = function(i, v)
							nnCast.db.profile.position.interrupt = v
							nnCast.db.profile.position.hostileinterrupt = v
							nnCast.db.profile.position.reflect = v
						end,
						values = listPosition,
						order = 92,
					},
				},
			},
			-----------------
			-- Success/Missed
			-----------------
			success = {
				type = "group",
				name = "사용/실패",
				desc = "주문 사용/실패 관련 설정",
				order = 40,
				args = {
					success = {
						type = "toggle",
						name = "주문 사용 알림",
						desc = "지정된 주문을 사용 했을때 알리는 기능을 사용합니다.",
						get = function(i) return nnCast.db.profile.success end,
						set = function(i, v)
							nnCast.db.profile.success = v
							nnCast:LoadEvents()
						end,
						order = 10,
					},
					missed = {
						type = "toggle",
						name = "주문 실패 알림",
						desc = "지정된 주문이 실패 했을때 알리는 기능을 사용합니다.",
						get = function(i) return nnCast.db.profile.missed end,
						set = function(i, v)
							nnCast.db.profile.missed = v
							nnCast:LoadEvents()
						end,
						order = 20,
					},
					head1 = {
						type = "header",
						name = "",
						order = 80,
					},
					desc1 = {
						type = "description",
						name = "대화창 알림 설정",
						order = 81,
					},
					channel = {
						type = "select",
						name = "주문 사용/실패 알림 채널",
						desc = "주문 사용/실패 알림 메세지를 출력할 채널 선택.",
						get = function(i) return nnCast.db.profile.channel.success end,
						set = function(i, v)
							nnCast.db.profile.channel.success = v
							nnCast.db.profile.channel.missed = v
						end,
						values = listChannel,
						order = 82,
					},
					whisper = {
						type = "input",
						name = "주문 사용/실패 귓속말 알림 대상",
						desc = "주문 사용/실패 귓속말 알림 대상의 ID를 입력하세요.",
						get = function(i) return nnCast.db.profile.whisper.success end,
						set = function(i, v)
							nnCast.db.profile.whisper.success = v
							nnCast.db.profile.whisper.missed = v
						end,
						usage = "<사용자명>",
						pattern = "^[a-zA-Z가-힣]*$",
						order = 83,
					},
					head2 = {
						type = "header",
						name = "",
						order = 90,
					},
					desc2 = {
						type = "description",
						name = "외부 UI 표시 설정",
						order = 91,
					},
					position_success = {
						type = "select",
						name = "주문 사용 표시 위치",
						desc = "주문 사용 메세지를 표시할 위치 선택.",
						get = function(i) return nnCast.db.profile.position.success end,
						set = function(i, v) nnCast.db.profile.position.success = v end,
						values = listPosition,
						order = 92,
					},
					position_missed = {
						type = "select",
						name = "주문 실패 표시 위치",
						desc = "주문 실패 메세지를 표시할 위치 선택.",
						get = function(i) return nnCast.db.profile.position.missed end,
						set = function(i, v) nnCast.db.profile.position.missed = v end,
						values = listPosition,
						order = 93,
					},
				},
			},
			-------
			-- Aura
			-------
			aura = {
				type = "group",
				name = "버프/디버프",
				desc = "버프/디버프 관련 설정",
				order = 50,
				args = {
					aura = {
						type = "toggle",
						name = "대상 버프/디버프 알림",
						desc = "자신에 의해 시전되는 주요 버프/디버프에 대한 알림 기능을 사용합니다.",
						get = function(i) return nnCast.db.profile.aura end,
						set = function(i, v)
							nnCast.db.profile.aura = v
							nnCast:LoadEvents()
						end,
						order = 10,
					},
					debuff = {
						type = "toggle",
						name = "디버프 획득 알림",
						desc = "자신이 걸리는 주요 디버프에 대한 알림 기능을 사용합니다.",
						get = function(i) return nnCast.db.profile.debuff end,
						set = function(i, v)
							nnCast.db.profile.debuff = v
							nnCast:LoadEvents()
						end,
						order = 20,
					},
					duration = {
						type = "toggle",
						name = "버프/디버프 지속 시간 표시",
						desc = "버프/디버프의 지속 시간을 표시합니다.",
						get = function(i) return nnCast.db.profile.duration end,
						set = function(i, v) nnCast.db.profile.duration = v end,
						order = 30,
					},
					head1 = {
						type = "header",
						name = "",
						order = 80,
					},
					desc1 = {
						type = "description",
						name = "대화창 알림 설정",
						order = 81,
					},
					channel = {
						type = "select",
						name = "버프/디버프 알림 채널",
						desc = "버프/디버프 알림 메세지를 출력할 채널 선택.",
						get = function(i) return nnCast.db.profile.channel.aura end,
						set = function(i, v)
							nnCast.db.profile.channel.aura = v
							nnCast.db.profile.channel.debuff = v
						end,
						values = listChannel,
						order = 82,
					},
					whisper = {
						type = "input",
						name = "버프/디버프 귓속말 알림 대상",
						desc = "버프/디버프 귓속말 알림 대상의 ID를 입력하세요.",
						get = function(i) return nnCast.db.profile.whisper.aura end,
						set = function(i, v)
							nnCast.db.profile.whisper.aura = v
							nnCast.db.profile.whisper.debuff = v
						end,
						usage = "<사용자명>",
						pattern = "^[a-zA-Z가-힣]*$",
						order = 83,
					},
					head2 = {
						type = "header",
						name = "",
						order = 90,
					},
					desc2 = {
						type = "description",
						name = "외부 UI 표시 설정",
						order = 91,
					},
					position_aura = {
						type = "select",
						name = "대상 버프/디버프 표시 위치",
						desc = "대상 버프/디버프 메세지를 표시할 위치 선택.",
						get = function(i) return nnCast.db.profile.position.aura end,
						set = function(i, v) nnCast.db.profile.position.aura = v end,
						values = listPosition,
						order = 92,
					},
					position_debuff = {
						type = "select",
						name = "디버프 획득 표시 위치",
						desc = "디버프 획득 메세지를 표시할 위치 선택.",
						get = function(i) return nnCast.db.profile.position.debuff end,
						set = function(i, v) nnCast.db.profile.position.debuff = v end,
						values = listPosition,
						order = 93,
					},
				},
			},
			------------
			-- Resurrect
			------------
			resurrect = {
				type = "group",
				name = "전투 부활",
				desc = "전투 부활 알림 설정",
				order = 60,
				args = {
					resurrect = {
						type = "toggle",
						name = "전투 부활 주문 성공 알림",
						desc = "지정된 전투 부활 주문이 성공했을때 알리는 기능을 사용합니다.",
						get = function(i) return nnCast.db.profile.resurrect end,
						set = function(i, v)
							nnCast.db.profile.resurrect = v
							nnCast:LoadEvents()
						end,
						order = 10,
					},
					head1 = {
						type = "header",
						name = "",
						order = 80,
					},
					desc1 = {
						type = "description",
						name = "대화창 알림 설정",
						order = 81,
					},
					channel = {
						type = "select",
						name = "전투 부활 알림 채널",
						desc = "전투 부활 알림 메세지를 출력할 채널 선택.",
						get = function(i) return nnCast.db.profile.channel.resurrect end,
						set = function(i, v)
							nnCast.db.profile.channel.resurrect = v
						end,
						values = listChannel,
						order = 82,
					},
					whisper = {
						type = "input",
						name = "전투 부활 주문 귓속말 알림 대상",
						desc = "전투 부활 주문 귓속말 알림 대상의 ID를 입력하세요.",
						get = function(i) return nnCast.db.profile.whisper.resurrect end,
						set = function(i, v)
							nnCast.db.profile.whisper.resurrect = v
						end,
						usage = "<사용자명>",
						pattern = "^[a-zA-Z가-힣]*$",
						order = 83,
					},
					head2 = {
						type = "header",
						name = "",
						order = 90,
					},
					desc2 = {
						type = "description",
						name = "외부 UI 표시 설정",
						order = 91,
					},
					position_resurrect = {
						type = "select",
						name = "전투 부활 주문 성공 표시 위치",
						desc = "전투 부활 주문 성공 메세지를 표시할 위치 선택.",
						get = function(i) return nnCast.db.profile.position.resurrect end,
						set = function(i, v) nnCast.db.profile.position.resurrect = v end,
						values = listPosition,
						order = 92,
					},
				},
			},
		},
	}

	----------------
	-- 커맨드 핸들러
	----------------
	local commandHandler = function(option)
		if option == "reset" then
			nnCast:Print("설정이 기본 값으로 초기화 되었습니다.")
			nnCast.db:ResetProfile()
		else
			--nnCast:Print(GetAddOnMetadata("nnCast", "Version"))
			InterfaceOptionsFrame_OpenToCategory("nnCast")
		end
	end

-------------------------------------------------------------------------------------
-- 함수
-------------------------------------------------------------------------------------
	function nnCast:SetupOptions()
		self.db = LibStub("AceDB-3.0"):New("nnCastDB", defaults, true)

		self.options = options
		self.options.args.profile = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db)

		LibStub("AceConfig-3.0"):RegisterOptionsTable(self.name, self.options)
		LibStub("AceConfigDialog-3.0"):AddToBlizOptions(self.name, self.name)

		self:RegisterChatCommand("nncast", commandHandler)
		self:RegisterChatCommand("nnc", commandHandler)
	end